﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace AttachedPropertiesDemo.DependencyObjects
{
    public class Student : DependencyObject
    {
        //使用快捷键 propdp 双击tab 自动生成依赖属性
        //更多参考：http://www.cnblogs.com/HelloMyWorld/archive/2013/02/21/2920149.html
        public string Name
        {
            get { return (string)GetValue(NameProperty); }
            set { SetValue(NameProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Name.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty NameProperty =
            DependencyProperty.Register("Name", typeof(string), typeof(Student), new PropertyMetadata("小红",OnPropertyChangedCallback));

        private static void OnPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            //MessageBox.Show("发生改变");
        }

        /*
         当第一次看到这个例子的时候，也许会有点百思不得其解的感觉——依赖属性不是一个Static对象么？哪怕有1000个Student实例，依赖属性只有一个啊，那么SetValue把值存储到哪里去了？GetValue又从哪里读取值？并且，依赖属性不是一个只读的吗？怎么可以写入值呢？其实这个问题直指依赖属性机制的核心.

         创建一个DependencyProperty实例并用它的CLR属性名和宿主类型名生成hash code，最后把hash code和DependencyProperty实例作为Key-Value对存入全局的,名为PropertyFormName的Hashtable中。
         使用了static和readonly是为了保证DependencyProperty的索引值唯一。真正的值是存在一个Hashtable中的，当然可读可写啦

         尽管student类没有实现INotifyPropertyChange接口，当属性的值发生改变时与之关联的Binding对象依然可以得到通知，依赖属性默认带有这样的功能，天生就是合格的数据源。
         */
    }
}
